package java6681.group;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;

/**
 * @author Junichiro
 * @description 随机分组
 * @date 2021-03-29 22:59
 **/

public class TaskGroups6681 {

    /**
     * 加载学生到集合中
     * @return 加载成功的人员集合
     * @throws FileNotFoundException 找不到文件报错
     */
    public ArrayList<Student6681> initStudents() throws FileNotFoundException {
        // 读取文件
        Scanner input = new Scanner(new File("data/Student.txt"));
        ArrayList<Student6681> lists = new ArrayList<>();
        // 循环添加到集合中
        while (input.hasNext()){
            String[] info = input.nextLine().split(" ");
            if(info.length >= 2){
                lists.add(new Student6681(info[1]));
            }
        }
        return lists;
    }

    /**
     * 生成人员分配方案
     * @param count 待分配的人员总数
     * @return 分配好的方案
     */
    public ArrayList<Integer> getGroupCase(int count){
        ArrayList<Integer> groupCase = new ArrayList<>();
        // 当还有人员未分配时循环
        while (count > 0){
            int num = new Random().nextInt(3) + 5;
            // 如果剩下的人员还够凑最小的一组, 且随机数小于或等于剩下的分配人数
            if(count >= 5 && num <= count){
                // 则进行分配
                groupCase.add(num);
                count -= num;
            }else{
                // 如果不够凑一组, 则进行随机选某个组, 把一人分配进去, 直到剩下的人分完
                int ranIndex = new Random().nextInt(groupCase.size() - 1);
                // 如果随机选中的这一组, 人数已经满了, 则跳过
                if(groupCase.get(ranIndex) < 7){
                    groupCase.set(ranIndex, groupCase.get(ranIndex) + 1);
                    count--;
                }
            }
        }
        return groupCase;
    }

    /**
     * 按照分组方案提取组员, 创建分组
     * @param groupCase 分组方案
     * @param students 学生列表
     * @return 分组好的分组集合
     */
    public ArrayList<Student6681[]> getGroupList(ArrayList<Integer> groupCase, ArrayList<Student6681> students){
        ArrayList<Student6681[]> result = new ArrayList<>();
        // 循环分组方案
        for(int caseItem: groupCase){
            // 根据分组方案当前项的组员人数循环
            Student6681[] group = new Student6681[caseItem];
            for (int i = 0; i < group.length; i++){
                // 如果学生只剩最后一个, 就直接添加到本组中
                if(students.size() == 1){
                    group[i] = students.remove(0);
                }else{
                    // 反之则随机抽取一个学生添加到本组中
                    group[i] = students.remove(new Random().nextInt(students.size() - 1));
                }
            }
            // 将创建好的组添加到分组集合中
            result.add(group);
        }
        return result;
    }
}
